﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
using namespace std;
// 原题连接：https://leetcode.cn/problems/divide-two-integers/description/
/*
题目描述：
给你两个整数，被除数 dividend 和除数 divisor。将两数相除，要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断，也就是截去（truncate）其小数部分。例如，8.345 将被截断为 8 ，-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的 商 。

注意：假设我们的环境只能存储 32 位 有符号整数，其数值范围是 [−231,  231 − 1] 。本题中，如果商 严格大于 231 − 1 ，则返回 231 − 1 ；如果商 严格小于 -231 ，则返回 -231 。



示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ，向零截断后得到 3 。
示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ，向零截断后得到 -2 。


提示：

-231 <= dividend, divisor <= 231 - 1
divisor != 0
*/

// 开始解题：
// 方法——位运算
class Solution {
public:
    int divide(int a, int b) {
        int flag = 1;
        if ((a < 0 && b > 0) || (a > 0 && b < 0)) {
            flag = -1;
        }
        vector<long long> exp;
        long long x = abs((long long)a), y = abs((long long)b);
        for (long long i = y; i <= x; i += i) {
            exp.push_back(i);
        }
        long long ret = 0;
        for (int i = exp.size() - 1; i >= 0; i--) {
            if (x >= exp[i]) {
                ret += 1ll << i;
                x -= exp[i];
            }
        }
        ret *= flag;
        if (ret > INT_MAX) {
            return INT_MAX;
        }
        if (ret < INT_MIN) {
            return INT_MIN;
        }
        return ret;
    }
};